package com.gimi.cloud.jimi.manage.service.sys.impl;

import com.gimi.cloud.jimi.common.enums.ResponseCodeEnum;
import com.gimi.cloud.jimi.common.exception.MsgException;
import com.gimi.cloud.jimi.common.utils.NumberUtil;
import com.gimi.cloud.jimi.common.utils.StringUtil;
import com.gimi.cloud.jimi.dao.dao.sys.SysAuthDao;
import com.gimi.cloud.jimi.dto.sys.SysAuthorityDTO;
import com.gimi.cloud.jimi.dto.sys.SysMenuDTO;
import com.gimi.cloud.jimi.dto.params.AuthListParams;
import com.gimi.cloud.jimi.dto.params.DoAuthParams;
import com.gimi.cloud.jimi.entity.sys.SysAuthorityEntity;
import com.gimi.cloud.jimi.manage.service.sys.AuthService;
import com.gimi.cloud.jimi.manage.service.sys.MenuService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * Created by shazhiwei on 2017/12/18.
 */
@Service
public class AuthServiceImpl implements AuthService{
    private final SysAuthDao authDao;

    public AuthServiceImpl(SysAuthDao authDao){
        this.authDao = authDao;
    }

//    @Override
//    public List<Map<String,Object>> getAuthList(AuthListParams params) {
//        List<Map<String,Object>> result = null;
//        SysMenuDTO menuDTO = new SysMenuDTO();
//        menuDTO.setMePid(params.getMenuId());
//        List<SysMenuDTO> menuList = menuService.getMenuListByPid(menuDTO);
//        if(menuList != null && menuList.size() > 0){
//            result = initState(params.getRoleId(),menuList);
//        }
//        return result;
//    }

//    @Override
//    public List<SysMenuDTO> getAuthTree(AuthListParams params) {
//        List<SysMenuDTO> allList = menuService.getMenuList();
//        //allList = dataFilter(allList);
//        List<SysMenuDTO> authList = menuService.getMenuListByRoleId(params.getRoleId());
//        return menuService.getMenuTree(allList,authList);
//    }

//    @Override
//    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
//    public void doAuth(DoAuthParams params) throws MsgException {
//        String roleId = params.getRoleId();
//        String menuIds = params.getMenuIds();
//        if(StringUtil.isBlank(roleId) || StringUtil.isBlank(menuIds)){
//            throw new MsgException(ResponseCodeEnum.MANAGE_AUTH_DO_AUTH_ERR);
//        }
//        //删除该角色权限
//        authDao.deleteByRoleId(NumberUtil.getInt(roleId));
//        //重新授权
//        String sql = "INSERT INTO sys_authority(ro_id,me_id,au_created) VALUES ";
//        String values = getValues(roleId,menuIds);
//        if(!StringUtil.isBlank(values)){
//            sql = sql + values;
//            authDao.saveBatch(sql);
//        }else{
//            throw new MsgException(ResponseCodeEnum.ERR_PASSWORD_TO_GET_TOKEN);
//        }
//    }

    @Override
    public SysAuthorityDTO doAuth(SysAuthorityDTO dto, Integer roId, String meIds) {
        if(null == roId){
            throw new MsgException(ResponseCodeEnum.MANAGE_AUTH_DO_AUTH_ERR,"角色Id为空，授权失败");
        }
        //根据角色id删除所有的授权
        authDao.deleteByRoleId(roId);
        //根据菜单id生成授权数据
        if(StringUtils.isNotBlank(meIds)){
            List<SysAuthorityEntity> authoritys = new ArrayList<>();
            SysAuthorityEntity authority = null;
            for(String meId:meIds.split(",")){
                if(StringUtils.isNotBlank(meId)){
                    authority = new SysAuthorityEntity();
                    authority.setRoId(roId);
                    authority.setMeId(Integer.valueOf(meId));
                    authority.setAuCreated(new Date());
                    authoritys.add(authority);
                }
            }
            authDao.insertList(authoritys);
        }
        return dto;
    }

//    /**
//     * 拼凑batchSave values
//     * @param roleId 角色id
//     * @param menuIds 菜单id,如：1,2,3
//     * @return
//     */
//    private String getValues(String roleId,String menuIds){
//        String[] meIds = menuIds.split(",");
//        StringBuilder sb = new StringBuilder();
//        if(meIds != null && meIds.length > 1){
//            for(int i = 0;i<meIds.length;i++){
//                sb.append("(");
//                sb.append(NumberUtil.getInt(roleId)).append(",").append(meIds[i]).append(",").append("now()");
//                sb.append("),");
//            }
//            if(sb.length() > 0){
//                sb.delete(sb.length()-1,sb.length());
//            }
//        }
//        return sb.toString();
//    }
//
//    List<SysMenuDTO> dataFilter(List<SysMenuDTO> allList){
//        List<SysMenuDTO> result = null;
//        if(allList != null && allList.size() > 0){
//            result = new ArrayList<>();
//            for (SysMenuDTO dto : allList){
//                SysMenuDTO tmp = new SysMenuDTO();
//                tmp.setMeId(dto.getMeId());
//                tmp.setMePid(dto.getMePid());
//                tmp.setMeName(dto.getMeName());
//                tmp.setMeAlias(dto.getMeAlias());
//                tmp.setMeIcon(dto.getMeIcon());
//                result.add(tmp);
//            }
//        }
//        return result;
//    }
//
//    List<Map<String,Object>> initState(Integer roleId,List<SysMenuDTO> list){
//        List<Map<String,Object>> result = null;
//        if(list != null && list.size() > 0){
//            List<SysAuthorityDTO> data = authDao.getListByRoleId(roleId);
//            if(data != null && data.size() > 0){
//                Map<Integer,Integer> meIdMap = new HashMap<>();
//                for(int i = 0;i<data.size();i++){
//                    SysAuthorityDTO tmp = data.get(i);
//                    meIdMap.put(tmp.getMeId(),i);
//                }
//                result = new ArrayList<>();
//                for (SysMenuDTO dto : list){
//                    Map<String,Object> tmpMap = new HashMap<>();
//                    tmpMap.put("meId",dto.getMeId());
//                    tmpMap.put("name",dto.getMeName());
//                    tmpMap.put("alias",dto.getMeAlias());
//                    Integer state = meIdMap.containsKey(dto.getMeId()) ? 1 : 0;//是否打钩
//                    tmpMap.put("state",state);
//                    result.add(tmpMap);
//                }
//            }
//        }
//        return result;
//    }


}
